/**
 * 
 */
package model;

import java.io.IOException;

import model.container.AangebodenCursussen;
import model.container.Cursisten;
import model.container.InschrijvingenException;
import persistenty.TekstPersisteerbaar;
import utils.Datum;

/**
 * This class is intended to setup the Inschrijving object. <br>
 * It has multiple arguments.<br>
 * Overridden methods have been setup (see below)
 * 
 * @author Nicolas Vanderhulst
 * @version 20111009
 */
public class Inschrijving implements Comparable<Inschrijving>, Cloneable, TekstPersisteerbaar {

	private Datum inschrijvingsDatum;
	private Cursist cursist;
	private int inschrijvingsID = -1;
	private AangebodenCursus aangebodencursus;

	/**
	 * @return the cursist
	 */
	public Cursist getCursist() {
		return cursist;
	}

	/**
	 * @param cursist
	 *            the cursist to set
	 */
	public void setCursist(Cursist cursist) {
		this.cursist = cursist;
	}

	/**
	 * @return the inschrijvingsDatum
	 */
	public Datum getInschrijvingsDatum() {
		return inschrijvingsDatum;
	}

	/**
	 * @param inschrijvingsDatum
	 *            the inschrijvingsDatum to set
	 */
	public void setInschrijvingsDatum(Datum inschrijvingsDatum) {
		this.inschrijvingsDatum = inschrijvingsDatum;
	}

	/**
	 * @return the aangebodencursus
	 */
	public AangebodenCursus getAangebodencursus() {
		return aangebodencursus;
	}

	/**
	 * @param aangebodencursus
	 *            the aangebodencursus to set
	 */
	public void setAangebodencursus(AangebodenCursus aangebodencursus) {
		this.aangebodencursus = aangebodencursus;
	}

	// Default constructor
	public Inschrijving() {

	}

	// Basic Constructor
	public Inschrijving(int ID, Cursist c, AangebodenCursus a, Datum idatum) throws Exception {
		this.setID(ID);
		this.setAangebodencursus(a);
		this.setCursist(c);
		this.setInschrijvingsDatum(idatum);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Inschrijving [inschrijvingsDatum=" + inschrijvingsDatum + ", cursist=" + cursist
				+ ", aangebodencursus=" + aangebodencursus + "]";
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((aangebodencursus == null) ? 0 : aangebodencursus.hashCode());
		result = prime * result + ((cursist == null) ? 0 : cursist.hashCode());
		result = prime * result + ((inschrijvingsDatum == null) ? 0 : inschrijvingsDatum.hashCode());
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (!(obj instanceof Inschrijving)) {
			return false;
		}
		Inschrijving other = (Inschrijving) obj;
		if (aangebodencursus == null) {
			if (other.aangebodencursus != null) {
				return false;
			}
		} else if (!aangebodencursus.equals(other.aangebodencursus)) {
			return false;
		}
		if (cursist == null) {
			if (other.cursist != null) {
				return false;
			}
		} else if (!cursist.equals(other.cursist)) {
			return false;
		}
		if (inschrijvingsDatum == null) {
			if (other.inschrijvingsDatum != null) {
				return false;
			}
		} else if (!inschrijvingsDatum.equals(other.inschrijvingsDatum)) {
			return false;
		}
		return true;
	}

	@Override
	public int compareTo(Inschrijving o) {
		Inschrijving i = o;
		if (i.inschrijvingsDatum.hashCode() < o.inschrijvingsDatum.hashCode()) {
			return -1;
		} else if (i.inschrijvingsDatum.hashCode() > o.inschrijvingsDatum.hashCode()) {
			return 1;
		} else {
			if (i.cursist.hashCode() < o.cursist.hashCode()) {
				return -1;
			} else if (i.cursist.hashCode() > o.cursist.hashCode()) {
				return 1;
			} else {
				return 0;
			}
		}
	}

	@Override
	public Inschrijving maakObjectVanTekst(String input) throws IOException, NumberFormatException,
			InschrijvingenException {
		Inschrijving tempInschrijving = new Inschrijving();
		String[] tokens = input.split("\t");
		// Opvullen variabelen
		tempInschrijving.setID(Integer.parseInt(tokens[0]));
		tempInschrijving.setInschrijvingsDatum(new Datum(tokens[3]));
		return tempInschrijving;
	}

	@SuppressWarnings("boxing")
	public void invullenCursistVanTekst(String input, Cursisten cursisten) {
		String[] tokens = input.split("t");
		Integer tekstID = Integer.parseInt(tokens[1]);
		for (Cursist c : cursisten) {
			if (c.getID() == tekstID) {
				this.setCursist(c);
			}
		}
	}

	@SuppressWarnings("boxing")
	public void invullenAangebodenCursusVanTekst(String input, AangebodenCursussen ac) {
		String[] tokens = input.split("t");
		Integer tekstID = Integer.parseInt(tokens[2]);
		for (AangebodenCursus c : ac) {
			if (c.getAangebodenCursusId() == tekstID) {
				this.setAangebodencursus(c);
			}
		}
	}

	@SuppressWarnings("boxing")
	@Override
	public String maakTekstVanObject() throws IOException {
		return String.format("%s\t%s\t%s\t%s\n", this.getID(), this.getCursist().getID(), this.getAangebodencursus()
				.getAangebodenCursusId(), this.getInschrijvingsDatum().getDatumInEuropeesFormaat());
	}

	@Override
	public void setID(int id) {
		inschrijvingsID = id > 0 ? id : inschrijvingsID;

	}

	@Override
	public int getID() {

		return inschrijvingsID;
	}
}
